package gof_001_创建型_Create.gof_001_单例_Singleton.gof_004_DoubleCheckedLocking;

public class Student {
    private volatile static Student student = null;

    private Student(){
    }

    /**
     * 并发情况下,假设一共有 ABCDEFG个线程,即使有多个线程 ABC 能够通过第一次的判空,
     * 之后也只会有某一个线程A 先进入同步代码块,只要进入同步代码块,其他通过第一步判空的线程 BC 只能等待,
     * A线程再次判空,如果没有就创建,然后A线程 退出,此时 BC 再进入同步代码块,此时的 student 已经不为空
     * @return
     */
    public static Student getInstance(){
        if(student == null){
            synchronized(Student.class){
                if(student == null){
                    student = new Student();
                }
            }
        }
        return student;
    }
}
